package com.itheima.service.db.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.domain.PmsProductCategory;
import com.itheima.mapper.PmsProductCategoryMapper;
import com.itheima.service.db.PmsProductCategoryService;
import com.itheima.util.R;
import com.itheima.vo.PageBeanVo;
import com.itheima.vo.PmsProductCategoryVo;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@DubboService
public class PmsProductCategoryServiceImpl implements PmsProductCategoryService {

    @Autowired
    PmsProductCategoryMapper pmsProductCategoryMapper;

    /**
     * 查询所有一级分类及其子分类
     * @return
     */
    @Override
    public List<PmsProductCategoryVo> findAll() {
        //1.查询所有的一级分类
        LambdaQueryWrapper<PmsProductCategory> qw = new LambdaQueryWrapper<>();
        qw.eq(PmsProductCategory::getParentId,0);
        List<PmsProductCategory> pmsProductCategories = pmsProductCategoryMapper.selectList(qw);
        List<PmsProductCategoryVo> voList = new ArrayList<>();
        //2.遍历所有的一级分类,
        if (CollUtil.isNotEmpty(pmsProductCategories)) {
            for (PmsProductCategory pmsProductCategory : pmsProductCategories) {
                //3.获取其id,通过id查询其子分类的信息
                PmsProductCategoryVo vo = new PmsProductCategoryVo();
                Long id = pmsProductCategory.getId();
                qw = new LambdaQueryWrapper<>();
                qw.eq(PmsProductCategory::getParentId,id);
                List<PmsProductCategory> children = pmsProductCategoryMapper.selectList(qw);
                //4.将一级分类的信息复制到vo类中
                BeanUtil.copyProperties(pmsProductCategory,vo);
                vo.setChildren(children);

                //5.将信息保存到voList中
                voList.add(vo);
            }
        }
        //6.返回结果
        return voList;
    }

    /**
     * 分页查询商品分类
     * @param parentId
     * @param pageNum
     * @param pageSize
     * @return
     */
    @Override
    public PageBeanVo findCategoryByPage(Integer parentId, Integer pageNum, Integer pageSize) {
        //1.创建分页构造器
        Page<PmsProductCategory> page = new Page<>(pageNum,pageSize);
        //2.创建查询器
        LambdaQueryWrapper<PmsProductCategory> qw = new LambdaQueryWrapper<>();
        qw.eq(PmsProductCategory::getParentId,parentId).orderByAsc(PmsProductCategory::getSort);
        //3.查询数据库
        pmsProductCategoryMapper.selectPage(page,qw);
        //4.返回数据
        return new PageBeanVo(pageNum,pageSize,page.getTotal(),page.getRecords());
    }

    /**
     * 添加分类
     * @param productCategoryParam
     */
    @Override
    public Boolean addCategory(PmsProductCategory productCategoryParam) {
        //1.根据分类名称查询数据该分类名是否已经存在
        LambdaQueryWrapper<PmsProductCategory> qw = new LambdaQueryWrapper<>();
        qw.eq(PmsProductCategory::getName,productCategoryParam.getName());
        Integer count = pmsProductCategoryMapper.selectCount(qw);
        if (count > 0) {
            //表示该名称已经存在
            return false;
        }else {
            //添加分类到数据库
            pmsProductCategoryMapper.insert(productCategoryParam);
            return true;
        }
    }

    /**
     * 删除分类
     * @param id
     */
    @Override
    public Boolean deleteCategory(Integer id) {
        //1.删除之前首先判断该分类下有没有子分类
        LambdaQueryWrapper<PmsProductCategory> qw = new LambdaQueryWrapper<>();
        qw.eq(PmsProductCategory::getParentId,id);
        List<PmsProductCategory> pmsProductCategories = pmsProductCategoryMapper.selectList(qw);
        if (CollUtil.isNotEmpty(pmsProductCategories)) {
            //2.如果不为空,则表示有子分类,不能直接删除,需要给出提示,需要删除子类后再进行删除
            /*for (PmsProductCategory pmsProductCategory : pmsProductCategories) {
                //3.获取分类id
                Long categoryId = pmsProductCategory.getId();
                //4.调用本方法级联删除
                deleteCategory(Math.toIntExact(categoryId));
            }*/
            return false;
        }else{
            //5.删除父级分类
            pmsProductCategoryMapper.deleteById(id);
            return true;
        }
    }

    /**
     * 修改导航栏状态
     * @param ids
     * @param navStatus
     */
    @Override
    public void updateNavStatus(List<Integer> ids, Integer navStatus) {
        //通过id修改状态
        for (Integer id : ids) {
            PmsProductCategory pmsProductCategory = new PmsProductCategory();
            pmsProductCategory.setId(Long.valueOf(id));
            pmsProductCategory.setNavStatus(navStatus);
            pmsProductCategoryMapper.updateById(pmsProductCategory);
        }
    }

    /**
     * 修改显示状态
     * @param ids
     * @param showStatus
     */
    @Override
    public void updateShowStatus(List<Integer> ids, Integer showStatus) {
        //通过id修改状态
        for (Integer id : ids) {
            PmsProductCategory pmsProductCategory = new PmsProductCategory();
            pmsProductCategory.setId(Long.valueOf(id));
            pmsProductCategory.setShowStatus(showStatus);
            pmsProductCategoryMapper.updateById(pmsProductCategory);
        }
    }

    /**
     * 修改商品分类信息
     * @param productCategoryParam
     * @return
     */
    @Override
    public Boolean updateCategory(PmsProductCategory productCategoryParam) {
        //1.根据分类名称查询数据该分类名是否已经存在
        LambdaQueryWrapper<PmsProductCategory> qw = new LambdaQueryWrapper<>();
        //2.添加查询条件,不同id的同名的分类名称是否存在
        qw.eq(PmsProductCategory::getName,productCategoryParam.getName())
                .ne(PmsProductCategory::getId,productCategoryParam.getId());

        Integer count = pmsProductCategoryMapper.selectCount(qw);
        if (count > 0) {
            //表示该名称已经存在,不能修改这个名字
            return false;
        }else {
            //修改分类到数据库
            //因为前端没有传递新的level值,所以要进行判断,重新设置level值
            Long parentId = productCategoryParam.getParentId();
            if (parentId == 0) {
                productCategoryParam.setLevel(0);
            }else{
                productCategoryParam.setLevel(1);
            }
            pmsProductCategoryMapper.updateById(productCategoryParam);
            return true;
        }
    }

    /**
     * 根据id查询商品分类
     * @param id
     * @return
     */
    @Override
    public PmsProductCategory findCategoryById(Long id) {
        return pmsProductCategoryMapper.selectById(id);
    }


}
